package com.twq.collection.list.highorder

/**
 * Created by tangweiqun on 2017/12/10.
 */
object Second {
  def main(args: Array[String]): Unit = {
    //Filtering lists: filter, partition, find, takeWhile, dropWhile, and span

    val words = List("the", "quick", "brown", "fox")

    //1、xs filter p 对一个List[T]的每一个元素应用函数 T => Boolean，饭后返回一个新List[T]，其中所有的元素都是符合p(x)为true的元素
    List(1, 2, 3, 4, 5) filter (_ % 2 == 0) //接受一个函数 (x: Int) => x % 2 == 0
    words filter (_.length == 3) //接受一个函数(str: String) => str.length == 3

    //2、xs partition p 对一个List[T]的每一个元素应用函数 T => Boolean，
    // 然后返回两个List[T]，其中一个List包含了p(x)为true的元素，另外一个则包含了p(x)为false的元素
    //其实，xs partition p equals (xs filter p, xs filter (!p(_)))
    List(1, 2, 3, 4, 5) partition (_ % 2 == 0)

    //3、xs find p 对一个List[T]的每一个元素应用函数 T => Boolean，然后返回一个Option[T]，
    // 如果List[T]中含有符合p(x)为true的，则返回第一个使得p(x)为true的元素Option(x)
    // 否则返回None
    List(1, 2, 3, 4, 5) find (_ % 2 == 0)
    List(1, 2, 3, 4, 5) find (_ <= 0)

    //4、对一个List[T]的每一个元素应用函数 T => Boolean，饭后返回一个新List[T]
    List(1, 2, 3, -4, 5) takeWhile (_ > 0)
    words dropWhile (_ startsWith "t")

    //5、xs span p equals (xs takeWhile p, xs dropWhile p)
    List(1, 2, 3, -4, 5) span (_ > 0)
  }
}
